package org.vacoor.ticket.handler.impl;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.vacoor.ticket.Constant;
import org.vacoor.ticket.bean.TicketDto;
import org.vacoor.ticket.handler.ResultHandler;
import org.vacoor.ticket.util.DateUtils;
import org.vacoor.ticket.util.ParseUtil;


public class TicketQueryResultHandler implements ResultHandler<List<TicketDto>> {

	/**
	 * 从结果中
	 */
	@Override
	public List<TicketDto> handler(byte[] content) {
		String result;
		try {
			result = new String(content,Constant.ENCODING);
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
			result = new String(content);
		}
		return parseTicket(result);
	}

	/**
	 * 从包含余票信息html代码中过滤html代码获取可购买的余票信息,只返回可购买的
	 * 
	 * @param ticketsInfo
	 *            包含余票信息的html代码
	 * @return
	 */
	public static List<TicketDto> parseTicket(String ticketsInfo) {
		List<TicketDto> list = new ArrayList<TicketDto>();
		// 过滤出每一班列车
		Pattern p = Pattern.compile("<span((?!\\\\n).)*");
		Matcher m = p.matcher(ticketsInfo);
		while (m.find()) {
			String info = m.group();
//			System.out.println("获取到车票信息:" + info);
			TicketDto dto = new TicketDto();
			// 删除html标签和实体
			String tmp = info.replaceAll("<[^>]*>", ",").replaceAll("(&[a-zA-Z]{4};)+", "");
			// 只留下一个","
			for (int i = 0; i < 4; i++) {
				tmp = tmp.replace(",,", ",");
			}
			//过滤后形式为 ",K621,郑州,23:44,洛阳,01:16,01:32,--,--,--,--,--,无,无,--,无,5,--,"
			System.out.println(DateUtils.formatDate(new Date(), "kk:mm:ss.SSS") + "-- 车票格式化信息:【" + tmp + "】");

			// 过滤可以订票的信息,并将可订票的信息补充完整
			//解析方式https://dynamic.12306.cn/otsweb/js/order/query_common_func.js?version=5.43
			//javascript:getSelected('K420#01:32#00:02#850000K42050#LYF#ZZF#01:34#洛阳#郑州#12#14#1*****30014*****00001*****00003*****0000#7DE5F2D8B3CC55B72A6FA2D8112B1A2ECE90D3D96ADD448B4F84CA27#J1')
			System.out.println(DateUtils.formatDate(new Date(), "kk:mm:ss.SSS") + "-- 检测车票状态:");
			Matcher ma = Pattern.compile("getSelected\\('[\\w\u4E00-\u9FA5:#*]+'\\)").matcher(info);
			if (ma.find()) {
				System.out.println(DateUtils.formatDate(new Date(), "kk:mm:ss.SSS") + "-- 该车票可购买,开始解析...");
				/*
				 * 替换为如下形式,然后分割
				 * 车次#历时#出发站发车时间#列车编号#出发站代码#目的站代码#目的地到达时间#出发站名称#目的站名称#出发站编号#目的站编号#余票信息#不知道什么东西#location???
				 * K420#01:32#00:02#850000K42050#LYF#ZZF#01:34#洛阳#郑州#12#14#1*****30014*****00001*****00003*****0000#7DE5F2D8B3CC55B72A6FA2D8112B1A2ECE90D3D96ADD448B4F84CA27#J1
				 */
				String group = ma.group();
				String replace = group.replace("getSelected('", "").replace("')", "");
				System.out.println(DateUtils.formatDate(new Date(), "kk:mm:ss.SSS") + "-- 预订信息:" + replace);
				String[] sp = replace.split("#");
//				System.out.println("车次:" + sp[0]);
				dto.setTrainCode(sp[0]);
//				System.out.println("历时:" + sp[1]);
				dto.setCountTime(sp[1]);
//				System.out.println("出发站发车时间:" + sp[2]);
				dto.setStartTime(sp[2]);
//				System.out.println("列车编号:" + sp[3]);
				dto.setTrainNo(sp[3]);
//				System.out.println("出发站代码:" + sp[4]);
				dto.setFromStationCode(sp[4]);
//				System.out.println("目的站代码:" + sp[5]);
				dto.setArriveStationCode(sp[5]);
//				System.out.println("目的站到达时间:" + sp[6]);
				dto.setEndTime(sp[6]);
//				System.out.println("出发站名称:" + sp[7]);
				dto.setFromStationName(sp[7]);
//				System.out.println("目的站名称:" + sp[8]);
				dto.setArriveStationName(sp[8]);
//				System.out.println("from_station_no:" + sp[9]);
				dto.setFromStationNo(sp[9]);
//				System.out.println("to_station_no:" + sp[10]);
				dto.setArriveStationNo(sp[10]);
//				System.out.println("余票详情:" + sp[11]);
				dto.setRemainTicketsDetail(sp[11]);
//				System.out.println("mmStr:" + sp[12]); 
				dto.setMmStr(sp[12]);
//				System.out.println("locationCode:" + sp[13]);
				dto.setLocationCode(sp[13]);
				dto.setSeatInfo(ParseUtil.parseTicketStr(sp[11]));
				list.add(dto);
			}else {
				System.out.println(DateUtils.formatDate(new Date(), "kk:mm:ss.SSS") + "-- 不可购买,跳过");
			}
		}
		return list;
	}
	
}
